package com.ecube.protocol.charge;

import com.ecube.protocol.common.ProtocolFunction;
import com.ecube.protocol.enums.ChargeFunctionEnum;
import lombok.Builder;
import lombok.Data;

import java.util.Arrays;
import java.util.List;

/**
 * 充电站
 *  充放电设备实时状态
 *
 * @author zhuweijun
 * @version 1.0.0
 * @since 2025/8/11 11:38
 */
@Data
@ProtocolFunction(type = ChargeFunctionEnum.class, value = "CHARGER_STATE")
public class ChargeChargerState {

    /**
     * 编号
     */
    private String code;

    /**
     * 状态：1-正常；2-检修；3-故障；4-离线
     */
    private Integer state = 1;

    /**
     * 软件版本
     */
    private String softwareVersion = "V2.0.1";

    /**
     * 硬件版本
     */
    private String hardwareVersion = "V1.0.2";

    /**
     * 充电：费率模型ID
     */
    private String rateModelID = "12601";

    /**
     * 放电：费率模型ID
     */
    private String dischgRateModelID = "12602";

    /**
     * 经度
     */
    private Float lng = 23.02154F;

    /**
     * 纬度
     */
    private Float lat = 123.021445F;

    /**
     * 网络信号强度
     */
    private Integer networkConn = 85;

    /**
     * 充电最大限制功率
     */
    private Float chgMaxLimitPower = 256.00F;

    /**
     * 放电最大限制功率
     */
    private Float dischgMaxLimitPower = 342.01F;

    /**
     * 充放电终端集合
     */
    private List<TermInfo> termList;

    /**
     * 充放电接口状态集合
     */
    private List<GunInfo> gunList;

    /**
     * 电表集合
     */
    private List<MeterInfo> meterList;

    /**
     * 单个电表数据
     */
    @Data
    public static class MeterInfo {
        /**
         * 编码
         */
        private String code;

        /**
         * 所属子设备编码：1-主机；2-终端；3-充放电接口
         */
        private Integer subDeviceType = 1;

        /**
         * 所属子设备编码
         */
        private String subDeviceCode;

        /**
         * 累计正向电量
         */
        private List<Float> totalEPI;

        /**
         * 累计反向电量
         */
        private List<Float> totalEPE;

        /**
         * 采集时间
         */
        private String cTime;
    }

    /**
     * 单个充放电接口数据
     */
    @Data
    public static class GunInfo {

        /**
         * 序号：1
         */
        private Integer code;
        /**
         * 所属终端编码
         */
        private String termCode;

        /**
         * 状态：1-待机；2-充电；3-充电完成；4-故障；5-离线；6-放电；7-放电完成；8-启动中；9-停止中；
         */
        private Integer state = 2;

        /**
         * 充放电模式：1-普通；2-轮充放；3-大功率；4-超极充放；5-电池维护；6-柔性充放
         */
        private Integer chgMode = 1;

        /**
         * 车连接状态：1-已连接，2-未连接
         */
        private Integer vehicleConn = 1;

        /**
         * 电子锁状态：1-已连接，2-未连接
         */
        private Integer elockConn = 1;

        /**
         * BMS通信状态：1-已连接，2-未连接
         */
        private Integer bmsConn = 1;
        /**
         * 辅助电源状态：1-已连接，2-未连接
         */
        private Integer apsConn = 1;

        /**
         * 充电最大限制功率
         */
        private Float chgMaxLimitPower = 256.00F;

        /**
         * 放电最大限制功率
         */
        private Float dischgMaxLimitPower = 156.00F;
    }

    /**
     * 单个充放电终端数据
     */
    @Data
    @Builder
    public static class TermInfo {
        /**
         * 终端编码
         */
        private String code;

        /**
         * 类型：1-物理，2-虚拟
         */
        private Integer type = 1;

        /**
         * 是否支持功率控制：1-支持，2-不支持
         */
        private Integer isPowerSetSup = 1;

        /**
         * 充电最大限制功率
         */
        private Float chgMaxLimitPower = 100.00F;

        /**
         * 放电最大限制功率
         */
        private Float dischgMaxLimitPower = 120.00F;
    }

}
